package BL;

import ActionForm.Seguridad.AutenticarActionForm;

import BD.UsuarioBD;
import BD.ClavesNoPermitidasBD;
import BE.Clavesnopermitidas;
import BE.Funcionalidad;
import BE.Usuario;
import java.util.ArrayList;
import java.util.Iterator;
import javax.servlet.http.HttpServletRequest;

/**
 *
 * @author marvil
 * @todo cambiar println por log
 */
public class UsuarioBL {

    public ArrayList<Usuario> buscarUsuario(Usuario objUsuario) {
        UsuarioBD objUsuarioBD = new UsuarioBD();
        ArrayList<Usuario> listaUsuarios = new ArrayList<Usuario>() {
        };

        listaUsuarios = (ArrayList<Usuario>) objUsuarioBD.buscarUsuario(objUsuario);
        return listaUsuarios;
    }

    public Usuario buscarUsuarioPorSrl(Usuario objUsuario) {
        UsuarioBD objUsuarioBD = new UsuarioBD();
        Usuario objUsuarioResultado = objUsuarioBD.buscarUsuarioPorSrl(objUsuario);
        if (objUsuarioResultado == null) System.out.println("no se encontro");
        return objUsuarioResultado;
    }

    public Usuario buscarParaAutenticar(AutenticarActionForm objAutenticarActionForm) {
        Usuario objUsuario = new Usuario();
        ArrayList<Usuario> listaUsuarios;

        objUsuario.setCvIdusuario(objAutenticarActionForm.getUsuario());
        objUsuario.setCvContrasenha(objAutenticarActionForm.getContrasenha());
        listaUsuarios = this.buscarUsuario(objUsuario);
        if (listaUsuarios.size() == 0) {
            System.out.println("No se encontro un usuario");
        } else if (listaUsuarios.size() == 1) {
            return listaUsuarios.get(0);
        } else { // menor a 0 o  mayor a 1
            System.out.println("Probable error, se encontraron " + listaUsuarios.size() + " usuarios con los datos ingresados");
        }
        return null;
    }

    /**
     *
     * @todo implementar!!!
     * @param strClave1
     * @return
     */
    public boolean esClaveValida(String strClave) {
        // no dejar clave vacía
        if (strClave.trim().isEmpty()) {
            return false;
        }
        // verificar no es una clave comun
        ClavesNoPermitidasBD objClavesNoPermitidasBD = new ClavesNoPermitidasBD();
        Clavesnopermitidas objClaveResultado = objClavesNoPermitidasBD.obtenerClave(new Clavesnopermitidas(0, strClave));
        if (objClaveResultado != null) {
            // coincide con alguna entrada no valida
            return false;
        }
        //TODO: Verificar caracteristicas de la clave segun parametros del sistema
        return true;
    }

    public ArrayList<Funcionalidad> obtieneFuncionalidadesPermitidas(int srlIdPersona) {
        // obtener funcionalidades permitidas por el usuario
        UsuarioBD objUsuarioBD = new UsuarioBD();
        ArrayList<Funcionalidad> listaFuncionalidades = objUsuarioBD.obtieneFuncionalidadesPermitidas(srlIdPersona);
        return listaFuncionalidades;
    }

    public boolean encuentraFuncionalidad(ArrayList<Funcionalidad> listaFuncionalidades, Funcionalidad objFuncionalidad) {
        Iterator it = listaFuncionalidades.iterator();
        while (it.hasNext()) {
            Funcionalidad objFuncionalidadPermitida = (Funcionalidad) it.next();
            // si la funcionalidad de este objeto esta en la lista de las permitidas mostrar
            if ( objFuncionalidad.getCvNombre().equalsIgnoreCase(objFuncionalidadPermitida.getCvNombre()) ) {
                return true;
            }
        }
        return false;
    }

    /**
     * Obtiene un objeto usuario correspondiente al usuario autnticado
     * @param request
     *   el request que viene en los métodos de las clases action
     * @return
     *   Nulo si no hay nadie autenticado, de otra manera un objeto usuario.
     */
    public Usuario obtieneUsuarioAutenticado(HttpServletRequest request) {
        Integer srlPersona = util.Web.obtieneUidAutenticado(request);
        if (srlPersona == 0) { // usuario anonimo
            return null;
        }
        Usuario objUsuarioBuscado = new Usuario();
        objUsuarioBuscado.setSrlIdpersona(srlPersona);
        return this.buscarUsuarioPorSrl(objUsuarioBuscado);
    }
}
